Variables numéricas

R para Ciencia de Datos en Salud:
Análisis Descriptivo e Inferencia Estadística

Percy Soto-Becerra M.D., M.Sc(c)

InkaStats Data Science Solutions | Medical Branch
@github/psotob91

Análisis descriptivo de variables numéricas

Análisis descriptivo

¿Análisis descriptivo?

  • ¿Cuándo? Luego de AID uno ya está listo para describir sus datos.

  • ¿Cómo? Hay muchas formas de describir datos, todos son combinación de medidas de resumen en texto y tablas, así como gráficos.

  • ¿Para qué?

    • Un fin en sí mismo en estudios descriptivos propiamente dichos.

    • Un medio para un fin en estudios que tienen objetivos de inferencia causal o perdicción.

      • Importante describir características para facilitar la comparación de nuestra población de estudio con otras poblaciones.

¿Qué describir de los datos numéricos?

  • Forma

    • Simetría: Sesgo a la derecha, sesgo a la izquierda, simétrico

    • Modas: Unimodal, bimodal, multimodal, uniforme (no moda)

    • Curtosis: Solo en distribución unimodal

  • Centro

    • media, mediana, moda (no siempre útil)
  • Dispersión

    • rango (mínimo y máximo), desviación estándar, rango intercuartílico (percentil 25 y 75)
  • Observaciones inusuales

Los datos que usaremos


Estudio sobre inmunogenicidad de tercera dosis. Se usó datos simulados del estudio titulado “Immunogenicity and reactogenicity of a third dose of BNT162b2 vaccine for COVID-19 after a primary regimen with BBIBP-CorV or BNT162b2 vaccines in Lima, Peru”https://doi.org/10.1101/2022.05.01.22274548

  • Importación de datos
bd_inmuno <- read_stata("boost_inmuno.dta") %>% 
  as_factor()
head(bd_inmuno)
# A tibble: 6 × 9
     id  edad sexo      comorb tipo_refuerzo tdosis_refuerzo ant_COV   IgG_Basal
  <dbl> <dbl> <fct>     <fct>  <chr>                   <dbl> <fct>         <dbl>
1     1    23 Femenino  No     Heterologo                233 Prior In…     99.8 
2     2    24 Masculino No     Heterologo                232 Prior In…     41.3 
3     3    24 Femenino  No     Heterologo                242 No Infec…    414.  
4     4    23 Femenino  No     Heterologo                234 No Infec…     13.4 
5     5    24 Femenino  No     Heterologo                236 Prior In…      4.83
6     6    26 Femenino  No     Heterologo                241 Prior In…     21.7 
# … with 1 more variable: IgG_Final <dbl>
bd_inmuno %>% glimpse()
Rows: 285
Columns: 9
$ id              <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
$ edad            <dbl> 23, 24, 24, 23, 24, 26, 25, 27, 25, 26, 28, 28, 27, 29…
$ sexo            <fct> Femenino, Masculino, Femenino, Femenino, Femenino, Fem…
$ comorb          <fct> No, No, No, No, No, No, No, No, No, No, No, No, No, No…
$ tipo_refuerzo   <chr> "Heterologo", "Heterologo", "Heterologo", "Heterologo"…
$ tdosis_refuerzo <dbl> 233, 232, 242, 234, 236, 241, 201, 241, 212, 239, 246,…
$ ant_COV         <fct> Prior Infection, Prior Infection, No Infection, No Inf…
$ IgG_Basal       <dbl> 99.79, 41.34, 413.50, 13.42, 4.83, 21.70, 8.70, 10.81,…
$ IgG_Final       <dbl> 554.63, 549.02, 485.43, 573.46, 473.81, 603.79, 532.84…
bd_inmuno %>% 
  skim()
Data summary
Name Piped data
Number of rows 285
Number of columns 9
_______________________
Column type frequency:
character 1
factor 3
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
tipo_refuerzo 0 1 8 10 0 2 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
sexo 0 1 FALSE 2 Fem: 190, Mas: 95
comorb 0 1 FALSE 2 No: 214, Sí: 71
ant_COV 0 1 FALSE 2 No : 201, Pri: 84

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 0 1 143.00 82.42 1.00 72.00 143.00 214.00 285.00 ▇▇▇▇▇
edad 0 1 48.25 14.71 23.00 36.00 46.00 59.00 97.00 ▇▇▇▂▁
tdosis_refuerzo 0 1 214.47 25.28 134.00 199.00 222.00 235.00 267.00 ▁▂▃▇▁
IgG_Basal 0 1 84.01 124.58 -2.19 8.18 28.59 97.18 583.97 ▇▁▁▁▁
IgG_Final 0 1 492.26 71.15 235.51 447.18 501.20 545.15 618.44 ▁▁▃▇▅

Variables numéricas

  • edad
  • tiempo desde segunda dosis a dosis de refuerzo (tercera dosis)
  • Nivel basal de IgG
  • Nivel final de IgG

Variables categóricas

  • tipo de refuerzo (dosis 3)
  • sexo
  • comorbilidades
  • antecedente de COVID-19

¿Cómo describir en los datos numéricos?


  • Medidas numéricas de resumen en tablas o texto

    • Medidas de tendencia central

    • Medidas de posición

  • Gráficos

    • Histogramas

    • Densidad

    • Cajas

    • Violin

    • Puntos

    • Combinación de gráficos

Gráficos

Intro sobre gráficos de variables numéricas


  • Permiten visualizar la distribución de la variable numérica en la muestra de datos.

  • Hay varios tipos de gráficos que pueden hacerse para inspeccionar la variable numérica.

  • Hay que distinguir dos tipos de gráficos:

    • Los de inspección: Deben ser rápidos de generar y leer, aunque no sean tan personalizables o elegantes. Usar funciones wrapper() de otros paquetes ayuda mucho. Usaremos {ggpubr}

    • Los de reporte: Deben ser elegantes y super personalizados., aunque se demoren en generarse. ¡{ggplot2} es fenomenal para estos!

ggplot2

Pros

  • Paquete que proporciona funciones que siguen la gramática de gráficos.

  • Altamante personalizable:

    • Prácticamente no hay ningún gráfico que no puedas crear con ggplot2.

Contras

  • Aunque cuenta con varios atajos de personalización (p. ej., theme_), sigue requiriendo bastante código.

  • Se deben dibujar una variable a la vez. Dibujar varias variables a la vez es un poco más “tricky” y requiere un poco de programación en R.

ggpubr

Pros

  • Es un atajo o “wrapper” de ggplot2.

    • Puedo seguir usando funciones de ggplot agregando capas adicionales con operador: +
  • Se requiere mucho menos código para gráficos de interés y se pueden graficar varias variables a la vez.

Contras

  • Su capacidad de personalización es menor que ggplot2. Sin embargo, al construirse sobre ggplot2, puede seguir modificándose sobre este.

  • Dependes de los gráficos iniciales que ggpubr te ofrece.

Histogramas de frecuencias

Podemos crear histogramas usando la geometría geom_histogram().

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Se puede configurar el ancho de las barras (bins e inglés).

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(binwidth = 5) 

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(binwidth = 50) 

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(binwidth = 200) 

Podemos personalizar el gráfico agregando capas. Por ejemplo, podemos usar labs() y theme_:

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(binwidth = 5) + 
  labs(x = "Ig G al inicio del estudio", 
       y = "Frecuencia", 
       title = "Distribución de la IgG") + 
  theme_bw()



Más información en el siguiente enlace:

https://ggplot2.tidyverse.org/reference/geom_histogram.html

Histogramas de densidades

Podemos usar densidades en vez de frecuencias absolutas o relativas en los histogramas. En variables continuas, las densidades se aproximan mejor a la idea de densidad de probabilidad

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Se puede configurar el ancho de las barras (bins e inglés).

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..), 
                 binwidth = 5)

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..), 
                 binwidth = 50)

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..), 
                 binwidth = 200)

Podemos personalizar el gráfico agregando capas. Por ejemplo, podemos usar labs() y theme_:

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  labs(x = "Ig G al inicio del estudio", 
       y = "Frecuencia", 
       title = "Distribución de la IgG") + 
  theme_bw()



Más información en el siguiente enlace:

https://ggplot2.tidyverse.org/reference/geom_histogram.html

Densidad

En vez de graficar histogramas, podemos dibujar gráfico de densidades cuyas curvas están suavizadas imitando el aspecto de una distribución de probabilidad. Usamo la geometría geom_density().

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_density()

Se puede configurar el parámetro de suavización adjust

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_density(adjust = 0.1)

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_density(adjust = 0.5)

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_density(adjust = 2)

Podemos personalizar el gráfico agregando capas. Por ejemplo, podemos usar labs() y theme_:

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_density(adjust = 1) + 
  labs(x = "Ig G al inicio del estudio", 
       y = "Densidad", 
       title = "Distribución de la IgG") + 
  theme_bw()



Más información en el siguiente enlace:

https://ggplot2.tidyverse.org/reference/geom_density.html

Gráfico de cajas

Podemos crear gráficos de cajas usando la geometría geom_boxplot().

Cajas horizontales

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_boxplot()

Cajas verticales

bd_inmuno %>% 
  ggplot(aes(y = IgG_Basal)) + 
  geom_boxplot()

Podemos personalizar el gráfico agregando capas. Por ejemplo, podemos usar labs() y theme_. También podemos eliminar los números y guiones del eje x usando theme().

bd_inmuno %>% 
  ggplot(aes(y = IgG_Basal)) + 
  geom_boxplot() + 
  labs(x = NULL, 
       y = "IgG basal (AU/mL)", 
       title = "Gráfico de cajas de IgG basal") + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank())

  • Anatomía:

    • Bordes de caja: percentil 25 (cuartil 1) y 75 (cuartil 3)

    • Linea horizontal dentro de caja: percentil 50 (cuartil 2 o mediana)

    • Rango intercuartílico (IQR): percentil 75- percentil 25

    • Bigotes: ± 1.5 IQR

    • Puntos fuera de bigotes: Outliers según regla de Tukey

  • Aunque se puede usar en gráficos univariados, no es un muy gráfico para estos fines.

    • ¡Es mejor para realizar comparaciones en análisis bivariados!
  • Los “outliers” o valores extremos son solo referenciales.

  • Las cajas sugieren simetría de distribución, pero no permiten ver la forma directamente:

Distribución simétrica

Distribución asimétrica



Más información en el siguiente enlace:

https://ggplot2.tidyverse.org/reference/geom_boxplot.html

Violin

Gráficos de violin son similares a gráficos de caja, excepto porque también muestran la densidad de probabilidad.

Cajas horizontales

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin()

Cajas verticales

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin()

Podemos personalizar el gráfico agregando capas. Por ejemplo, podemos usar labs() y theme_. También podemos eliminar los números y guiones del eje x usando theme().

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin() + 
  labs(x = NULL, 
       y = "IgG basal (AU/mL)", 
       title = "Gráfico de violin de IgG basal") + 
  theme_bw() + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

  • A menudo se reportan combinado con un gráfico de cajas, puntos o ambos.

  • Los gráficos de violin combinados dan mucha más información, por lo que se debería preferir usar.

  • Contraindicación: Si se cuentan con pocos datos, los gráficos de kernel no son confiables.

Distribución simétrica

Distribución asimétrica



Más información en el siguiente enlace:

https://ggplot2.tidyverse.org/reference/geom_violin.html

Combinación de gráficos

Se sugiere reportar gráficos descriptivos que sean informativos. Estos pueden obtenerse de combinar gráficos existentes. Veremos algunos ejemplos.

Sin personalizar

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..)) + 
  geom_density()

Personalizado

bd_inmuno %>% 
  ggplot(aes(x = IgG_Basal)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") + 
  geom_density(fill = 4, alpha = 0.25) + 
  theme_minimal()

Sin personalizar

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_boxplot() + 
  geom_dotplot(binaxis = "y", stackdir = "center") 

Personalizado

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_boxplot() + 
  geom_dotplot(binaxis = "y", stackdir = "center") + 
  labs(x = NULL, y = "IgG basal (AU/ml)") + 
  theme_minimal() + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

Sin personalizar

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_boxplot() +
  geom_jitter()

Personalizado

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_boxplot() +
  geom_jitter() + 
  labs(x = NULL, y = "IgG basal (AU/ml)") + 
  theme_bw() + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

Sin personalizar

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin() +
  geom_boxplot(width = 0.1)

Personalizado

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin() +
  geom_boxplot(width = 0.1) + 
  labs(x = NULL, y = "IgG basal (AU/ml)") + 
  theme_bw() + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

Sin personalizar

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin() +
  geom_boxplot(width = 0.1, outlier.color = "white") + 
  geom_jitter()

Personalizado

bd_inmuno %>% 
  ggplot(aes(x = 1, y = IgG_Basal)) + 
  geom_violin() +
  geom_boxplot(width = 0.1, outlier.color = "white") + 
  geom_jitter(color = "blue") + 
  labs(x = NULL, y = "IgG basal (AU/ml)") + 
  theme_bw() + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

Nuestro turno


  • Descargue la carpeta var_num_graficos.

  • Abra el proyecto var_num_graficos.Rproj y dentro de este, abra el archivo quarto var_num_graficos.qmd.

  • Siga las instrucciones indicadas en este.

  • Renderice el archivo quarto final.




10:00